/* 类的装饰器
*       @函数
*       class Xxx{}
*  创建类的时候，会把装饰器执行
*       + target: 当前装饰器的这个类
*       我们可以再装饰器函数中，给类设置一些静态私有的属性方法，或设置原型上的属性方法
*       ----
*       同一个装饰器可以作用再多个类上(需要基于 class 创建类)
*       同一个类上也可以使用多个装饰器
*       装饰器函数执行的返回结果，会替换原有类
*  */
const test = (target) => {
    // target:Demo  此处就是给类设置静态私有属性
    target.num = 100
    target.getNum = function () {
    }
    // 装饰器函数执行的返回结果，会替换原有类
    // return 100
}
const test1 = (x, y) => {
    // 返回的函数是装饰器函数
    console.log(1)
    return (target) => {
        console.log(2)
        target.num = x + y
    }
}
const test2 = (x) =>{
    console.log(3)
    return (target) =>{
        console.log(4)
        target.xxx= x
    }
}

@test   // 相当于 test(Demo)
@test1(10, 30)
@test2(10)
// 1 3 4 2   // 需要先把外层函数执行，获取装饰器函数后，再按照从下到上的顺序，来执行装饰器函
class Demo {
    static num = 1
}

@test
class Child {

}
console.dir(Demo)
console.dir(Child)


// 编译后代码
// const test = target => {
//     // target:Demo  此处就是给类设置静态私有属性
//     target.num = 100;
//     target.getNum = function () {};
//     // 装饰器函数执行的返回结果，会替换原有类
//     // return 100
// };
//
// const test1 = target => {
//     console.log(target.num, 222);
// };
// let Demo = test(_class = test1(_class = (_class2 = class Demo {}, _class2.num = 1, _class2)) || _class) || _class;
// let Child = test(_class3 = class Child {}) || _class3;
// console.dir(Demo);
// console.dir(Child);
